// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLName;
// import com.alibaba.druid.sql.ast.SQLReplaceable;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;
#pragma once

#include "../SQLExpr.h"
#include "../SQLName.h"
#include "../SQLReplaceable.h"

#include "SQLConstraintImpl.h"
#include "SQLTableElement.h"
#include "SQLTableConstraint.h"
// class SQLASTVisitor;

class SQLCheck
    : virtual public SQLConstraintImpl,
      virtual public SQLTableElement,
      virtual public SQLTableConstraint,
      virtual public SQLReplaceable
{
public:
  SQLExpr_ptr expr;
  BOOL_ptr enforced;

  SQLCheck();
  SHAREDOBJECT(SQLCheck);

  // SQLCheck(SQLExpr_ptr expr) {
  //     this->setExpr(expr);
  // }

  SQLExpr_ptr getExpr();

  void setExpr(SQLExpr_ptr x);

  void accept0(SQLASTVisitor_ptr visitor);

  void cloneTo(SQLCheck_ptr x);

  SQLObject_ptr clone()
  {
    // SQLCheck* x = new SQLCheck();
    SQLObject_ptr clone_tmp = std::shared_ptr<SQLCheck>(new SQLCheck());
    std::shared_ptr<SQLCheck> x = std::dynamic_pointer_cast<SQLCheck>(clone_tmp);
    cloneTo(x);
    return x;
  }

  // BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target) {
  //     if (this->expr == expr) {
  //         setExpr(target);
  //         return BOOL::TRUE;
  //     }

  //     if (getName() == expr) {
  //         setName((SQLName) target);
  //         return BOOL::TRUE;
  //     }

  //     if (getComment() == expr) {
  //         setComment(target);
  //         return BOOL::TRUE;
  //     }
  //     return BOOL::FALSE;
  // }

  BOOL_ptr getEnforced();

  void setEnforced(BOOL_ptr enforced);
};
